package com.scott.itcast.cycle;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * 循环路障
 */
public class CyclicBarrierTest {

	public static void main(String[] args) {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		
		//约定要5个人同时到达   5个人 就是 5个线程
		final int renshu =5;
		final  CyclicBarrier cb = new CyclicBarrier(renshu);
		for(int i=0;i<renshu;i++){
			Runnable runnable = new Runnable(){
					public void run(){
					try {
						Thread.sleep((long)(Math.random()*10000));	
						System.out.println("线程" + Thread.currentThread().getName() + 
								"即将到达集合地点1，当前已有" + (cb.getNumberWaiting()+1) + 
								"个已经到达，" + (cb.getNumberWaiting()==(renshu-1)?"都到齐了，继续走啊":"正在等候"));						
						cb.await(); //想在什么地方集合，就在什么地方await
						
						Thread.sleep((long)(Math.random()*10000));	
						System.out.println("线程" + Thread.currentThread().getName() + 
								"即将到达集合地点2，当前已有" + (cb.getNumberWaiting()+1) + 
								"个已经到达，" + (cb.getNumberWaiting()==(renshu-1)?"都到齐了，继续走啊":"正在等候"));
						cb.await();	
						
						Thread.sleep((long)(Math.random()*10000));	
						System.out.println("线程" + Thread.currentThread().getName() + 
								"即将到达集合地点3，当前已有" + (cb.getNumberWaiting() + 1) + 
								"个已经到达，" + (cb.getNumberWaiting()==(renshu-1)?"都到齐了，继续走啊":"正在等候"));						
						cb.await();						
					} catch (Exception e) {
						e.printStackTrace();
					}				
				}
			};
			threadPool.execute(runnable);
		}
		threadPool.shutdown();
	}
}
